package cn.mayday.algorithms.year2021.month1.深度优先遍历;

/**
 * 剑指 Offer 55 - II. 平衡二叉树
 * 输入一棵二叉树的根节点，判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1，那么它就是一棵平衡二叉树。
 *
 * @author Mayday05
 * @date 2021/5/12 15:07
 */
public class Offer055IIIsBalanced {

    public static void main(String[] args) {

    }

    // 先序遍历 + 判断深度（DFS 从顶到底）
    // 时间复杂度N*logN

    public boolean isBalanced(TreeNode root) {
        if (root == null) { // 特例处理，终止条件
            return true;
        }
        if (Math.abs(maxDepth(root.left) - maxDepth(root.right)) <= 1) {
            return isBalanced(root.left) && isBalanced(root.right);
        }
        return false;
    }

    /**
     * 计算当前阶段的最大深度
     *
     * @param root
     * @return
     */
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
    }


    //Definition for a binary tree node.
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }
}
